package ve.com.wayoyo.wuml_case.DibujoDiagramas;

import java.util.ArrayList;

import ve.com.wayoyo.wuml_case.DataTipe;
import ve.com.wayoyo.wuml_case.UserPref;
import ve.com.wayoyo.wuml_case.Exceptions.AtributoERException;
import ve.com.wayoyo.wuml_case.Exceptions.TipoDatoException;

public class CompMetodo {

	private String NombreMetodo;
	private String TipoDato;
	private String NivelAcceso;
	private ArrayList<CompVariable> VariablesEntrada = new ArrayList<CompVariable>();
	private boolean _isStatic;
	private boolean _isAbstract;
	private boolean _isFinal;
	private boolean _haveMultiplicity;
	private String _leftMultiplicity;
	private String _rightMultiplicity;

	public boolean isStatic() {
		return _isStatic;
	}

	public void set_isStatic(boolean _isStatic) {
		this._isStatic = _isStatic;
	}

	public boolean isAbstract() {
		return _isAbstract;
	}

	public void set_isAbstract(boolean _isAbstract) {
		this._isAbstract = _isAbstract;
	}

	public boolean isFinal() {
		return _isFinal;
	}

	public void set_isFinal(boolean _isFinal) {
		this._isFinal = _isFinal;
	}

	public CompMetodo(String nombreMetodo, String nivelAcceso) {
		NombreMetodo = nombreMetodo;
		NivelAcceso = nivelAcceso;
	}

	public CompMetodo() {

	}

	public void addVariable(CompVariable CompVariable) {
		VariablesEntrada.add(CompVariable);
	}

	public String getNombreMetodo() {
		return NombreMetodo;
	}

	public void setNombreMetodo(String nombreMetodo) throws AtributoERException {
		if (nombreMetodo.equals(""))
			throw new AtributoERException();
		NombreMetodo = nombreMetodo;
	}

	public String getTipoDato() {
		return TipoDato;
	}

	public void setTipoDato(String tipoDato) throws TipoDatoException {
		if (!tipoDato.equals("void"))
			if (VistaDiagrama.getVista() != null) {
				if (!DataTipe.getInstancia().dataExist(tipoDato))
					throw new TipoDatoException();
			}
		TipoDato = tipoDato;
	}

	public String getNivelAcceso() {
		return NivelAcceso;
	}

	public void setNivelAcceso(String nivelAcceso) {
		NivelAcceso = nivelAcceso;
	}

	public String getText() {
		String Respuesta = "";
		if (NivelAcceso.equals("public")) {
			Respuesta = "+ ";
		} else if (NivelAcceso.equals("private")) {
			Respuesta = "- ";
		} else if (NivelAcceso.equals("protected")) {
			Respuesta = "# ";
		} else {
			Respuesta = "";
		}

		Respuesta = Respuesta + getDefinition();

		if (_isFinal) {
			if (UserPref.getInstancia().getLengiajeClase().equals("C#"))
				Respuesta = Respuesta + "{sealed}";
			else
				Respuesta = Respuesta + " {Final}";
		}

		return Respuesta;

	}

	public String getDefinition() {
		String Respuesta = "";
		Respuesta = Respuesta + NombreMetodo + "(";
		if (VariablesEntrada.size() == 0) {
			Respuesta = Respuesta + ") ";
		} else {
			for (int i = 0; i < VariablesEntrada.size(); i++) {
				if (i != VariablesEntrada.size() - 1) {
					Respuesta = Respuesta + VariablesEntrada.get(i).getText()
							+ ", ";
				} else {
					Respuesta = Respuesta + VariablesEntrada.get(i).getText()
							+ ") ";
				}
			}
		}
		if (TipoDato.equals("void") == false) {
			Respuesta = Respuesta + ": " + TipoDato;
		}
		if (_haveMultiplicity) {
			try {
				int M = Integer.valueOf(_leftMultiplicity);
				int N;
				if (_rightMultiplicity.equals("*")) {
					if (M == 1) {
						Respuesta = Respuesta + "[*]";
					} else {
						Respuesta = Respuesta + "[" + M + "..*]";
					}
				} else {
					N = Integer.valueOf(_rightMultiplicity);
					if (M == N) {
						Respuesta = Respuesta + "[" + M + "]";
					} else {
						Respuesta = Respuesta + "[" + M + ".." + N + "]";
					}
				}
			} catch (Exception e) {
				System.out.println(e.getMessage());
			}
		}
		return Respuesta;
	}

	public ArrayList<CompVariable> getVariablesEntrada() {
		return VariablesEntrada;
	}

	public void setVariablesEntrada(
			ArrayList<CompVariable> listaAtributosEntrada) {
		VariablesEntrada = listaAtributosEntrada;
	}

	public String generarDOM() {
		String DOM = "\t\t<Metodo Nombre=\"" + NombreMetodo + "\" TipoDato=\""
				+ TipoDato + "\" NivelAcceso=\"" + NivelAcceso
				+ "\" IsStatic=\"" + _isStatic + "\" IsAbstract=\""
				+ _isAbstract + "\" IsFinal=\"" + _isFinal + "\" >\n";
		if (_haveMultiplicity)
			DOM = DOM + "\t\t\t<Multiplicidad Left=\"" + _leftMultiplicity
					+ "\" Right = \"" + _rightMultiplicity + "\"/>\n";
		for (CompVariable value : VariablesEntrada) {
			DOM = DOM + value.generarDOM();
		}
		DOM = DOM + "\t\t</Metodo>\n";
		return DOM;
	}

	public String getCode(String Languaje, boolean body, boolean override) {
		String atrib = "";
		if (Languaje.equals("Java")) {
			if (override)
				atrib = atrib + "\t@Override\n";
			if (!getNivelAcceso().equals("default"))
				atrib = atrib + getNivelAcceso() + " ";
		} else {
			if (!getNivelAcceso().equals("default"))
				atrib = atrib + getNivelAcceso() + " ";
			atrib = atrib + "override ";
		}
		if (!override) {
			if (isAbstract())
				atrib = atrib + "abstract ";
			if (isStatic())
				atrib = atrib + "static ";
			if (isFinal())
				if (UserPref.getInstancia().getLanguaje().equals("C#"))
					atrib = atrib + "sealed ";
				else
					atrib = atrib + "final ";
		}
		atrib = atrib + getTipoDato();
		atrib = atrib + " " + getNombreMetodo() + "(";
		for (int i = 0; i < getVariablesEntrada().size(); i++) {
			if (getVariablesEntrada().get(i).isFinal())
				atrib = atrib + "final ";
			if (i != getVariablesEntrada().size() - 1) {
				atrib = atrib + getVariablesEntrada().get(i).getTipoDato();
				atrib = atrib + " " + getVariablesEntrada().get(i).getNombre()
						+ ", ";
			} else {
				atrib = atrib + getVariablesEntrada().get(i).getTipoDato();
				atrib = atrib + " " + getVariablesEntrada().get(i).getNombre();
			}
		}
		atrib = atrib + ")";
		if (!body) {
			atrib = atrib + ";";
		} else {
			atrib = atrib + "{\n";
			if (UserPref.getInstancia().getLanguaje().equals("C#"))
				atrib = atrib
						+ "\t\t\t // TODO Codigo auto-generado por WUML \n";
			else
				atrib = atrib + "\t\t // TODO Codigo auto-generado por WUML \n";
			if (!getTipoDato().equals("void")) {
				if ((getTipoDato().equals("byte"))
						|| (getTipoDato().equals("short"))
						|| (getTipoDato().equals("int"))
						|| (getTipoDato().equals("long"))
						|| (getTipoDato().equals("float"))
						|| (getTipoDato().equals("double"))
						|| (getTipoDato().equals("char")))
					atrib = atrib + "\t\t\t return 0;\n";
				else if (getTipoDato().equals("boolean"))
					atrib = atrib + "\t\t\t return false;\n";
				else
					atrib = atrib + "\t\t\t return null;\n";
			}
			if (UserPref.getInstancia().getLanguaje().equals("C#"))
				atrib = atrib + "\t\t}\n";
			else
				atrib = atrib + "\t}\n";
		}
		// }
		return atrib;
	}
}
